iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
AI/ ML & Data

使用 jq 處理資料系列 第 7

Day7: 使用 jq filter 處理 JSON 陣列

  • 分享至 

  • xImage
  •  

繼我們學會取物件屬性的值之後,接下來該看看 Array: 陣列。

對話中學習

師傅:徒弟,現在懂得如何處理單個JSON物件了吧?

徒弟:是的,師傅!我覺得我已經掌握得差不多了。

師傅:哼,別太得意。現在來點刺激的!我們來玩玩陣列。

徒弟:陣列?那是...一堆JSON物件放在一起?

師傅:差不多。先把資料抓下來:curl -s https://jsonplaceholder.typicode.com/todos > todos.json

徒弟:好的,師傅。我已經執行了這個命令。接下來呢?

師傅:現在用 jq 看看裡面有什麼:jq "." todos.json

徒弟:哇!這麼多資料!看起來像是一大堆物件...在方括號裡面?

師傅:沒錯,這就是陣列。想知道有多少個物件嗎?

徒弟:當然想!我們要怎麼數呢?

師傅:簡單!jq "length" todos.json

徒弟:哇,200個!那...我們怎麼獲取特定的物件呢?

師傅:用索引,jq ".[0]" todos.json 給你第一個,jq ".[199]" todos.json 給你最後一個。

徒弟:我明白了!那如果我想要所有物件的 title 呢?

師傅:不錯,開始思考了!試試這個:jq ".[].title" todos.json


本地操作 JSON 資料

這邊我們先用前一天學到的技巧 curl -s https://jsonplaceholder.typicode.com/todos > todos.json,將 "TODO 陣列" 儲存為本地的檔案 todos.json

length 取得長度

我們在 Day4: JSON 學習小站 看過。JSON 的基本型別。jq 支援與 JSON 相同的型別 - 數字、字串、布林值、陣列、物件(注意在 JSON 中物件的鍵(key)只能是字串(string))和「null」。

這是 jq 內建的函式,用來看輸入值的長度。結果會因為輸入值的型別不同,而有不同的意義。我將個別型別對應的回傳整理如下表。

型別 長度(length函式回傳)
數字 它的絕對值
字串 它包含的 Unicode 碼位的數量(如果是純 ASCII,則與 JSON 編碼的位元組長度相同)
布林 錯誤 ❗
陣列 元素的數量
物件 鍵值對(key-value pairs)的數量
null 0

例如,取得 "TODO 陣列"來自(todos.json)的長度的指令如下:

jq "length" todos.json

https://ithelp.ithome.com.tw/upload/images/20240921/20078389oB5ORTnkef.png

下圖是另外用工具看的 todos.json,是一個內有200個物件的陣列([{物件}x200])

https://ithelp.ithome.com.tw/upload/images/20240921/20078389dM29PZkzO2.png

陣列索引 .[數字]

當索引值為整數時, .[數字]可以查找陣列。陣列索引是從零開始的,因此.[2]會返回第三個元素。

指令 jq ".[0]" todos.json 可取得 TODO陣列的第一個元素,參考下圖。

https://ithelp.ithome.com.tw/upload/images/20240921/20078389pDAyQqNLr0.png

jq 的索引值是允許負值的,-1 指最後一個元素,-2 指倒數第二個元素,依此類推。

指令 jq ".[199]" todos.jsonjq ".[-1]" todos.json 可取得 TODO陣列的最後一個元素,參考下圖。

https://ithelp.ithome.com.tw/upload/images/20240921/20078389hcrWAlDfKf.png

.[] 陣列 iterator

如果使用 .[數字] 語法,但完全省略索引數字,變成 .[],它將傳回陣列的所有元素。使用[1,2,3]這樣的簡單陣列去執行 jq filter .[] 將產生三個獨立結果的數字,而不是陣列。

.[] 也可以用在物件上,它將傳回物件的所有屬性值。

https://ithelp.ithome.com.tw/upload/images/20240921/20078389lTdYrAzmKB.png

將 TODO 陣列所有元素回傳的指令是 jq ".[]" todos.json,200個元素太多,截圖後面就省略囉。

https://ithelp.ithome.com.tw/upload/images/20240921/20078389VIErSW9oNC.png

將 TODO 陣列所有元素的 Title 屬性值回傳的指令是 jq ".[].title" todos.json。一樣會有200個title,截圖後面就省略囉。

https://ithelp.ithome.com.tw/upload/images/20240921/20078389RibYEPwEak.png

結論

今天我們學到了使用 jq filter 來取得陣列中的元素 .[數值];進一步,陣列中的元素是物件,我們可以使用先前學到的取得物件值的方式,取回物件中的屬性值。

使用 jq filter 表達式,在簡潔的指令就能從複雜的 JSON 取回自己要找的內容,是否感覺充滿了自信呢! 感謝自己即使是周末也沒有放棄😝繼續學習~


上一篇
Day6: 處理本地端 JSON 檔案
下一篇
Day8: jq filter 組合使用 pipe
系列文
使用 jq 處理資料30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言